微信开放文档 | 您所在的位置:网站首页 › 扫码登录 流程 › 微信开放文档 |
功能概述 扫码登录能力,指的是开发者可在移动应用内使用此能力,拉取二维码,用户使用微信客户端扫描二维码后可以登录此移动应用。此能力可被应用在多设备登录、智能硬件、电视盒子等场景。 iOS 扫码授权获得 Code 流程 步骤一:请求函数 (BOOL)Auth:(NSString *)appId nonceStr:(NSString *)nonceStr timeStamp:(NSString*)timeStamp scope:(NSString *) scope signature:(NSString *)signature schemeData:(NSString *)schemeData;参数说明 参数 是否必须 说明 appid 是 应用唯一标识 scope 是 应用授权作用域,拥有多个作用域用逗号(,)分隔,APP 所拥有的 scope nonceStr 是 一个随机的尽量不重复的字符串,用来使得每次的 signature 不同 timeStamp 是 时间戳 signature 是 签名 schemeData 否 会在扫码后拼在 scheme 后步骤二:监听二维码回调,回调的时候显示二维码 (void)onAuthGotQrcode:(UIImage *)image; //得到二维码步骤三:用户确认登录之后回调 authCode -(void)onAuthFinish:(int)errCode AuthCode:(NSString *)authCode; //成功登录Android 扫码授权流程 流程 首先 APP 通过 IDiffDevOAuth.auth()接口发起授权,然后在 OAuthListener.onAuthGotQrcode()回调接口中获取二维码,在 APP 中展示二维码,最后用户通过微信扫码,授权. 接口 IDiffDevOAuth boolean auth(String appId, String scope, String noncestr, String timestamp, String signature, OAuthListener listener)参数说明 参数 是否必须 说明 appId 是 应用唯一标识 scope 是 应用授权作用域,拥有多个作用域用逗号(,)分隔,APP 所拥有的 scope noncestr 是 一个随机的尽量不重复的字符串,用来使得每次的 signature 不同 timestamp 是 时间戳 signature 是 签名 listener 是 授权流程的回调接口 OAuthListener /** * auth之后返回的二维码接口 * * @param qrcodeImgPath 废弃 * @param imgBuf 二维码图片数据 */ void onAuthGotQrcode(String qrcodeImgPath, byte[] imgBuf); /** * 用户扫描二维码之后,回调该接口 */ void onQrcodeScanned(); /** * 用户点击授权后,回调该接口 */ void onAuthFinish(OAuthErrCode errCode, String authCode);SDK 扫码登录签名算法 获取 Ticket 生成签名之前必须先获取对应的 sdk_ticket。 sdk_ticket 是用于生成签名的临时票据。正常情况下,sdk_ticket 的有效期为 7200 秒,通过 access_token 来获取。由于获取 sdk_ticket 的 api 调用次数非常有限,频繁刷新 sdk_ticket 会导致 api 调用受限,影响自身业务,开发者需在自己的服务存储与更新 sdk_ticket。 1.参考以下文档,使用 APP 的 Appid 和 AppSecret 获取 access_token 2.用第一步拿到的 access_token,采用 http GET 方式请求获得 sdk_ticket: https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=2 成功返回如下 JSON: { "errcode": 0, "errmsg": "ok", "ticket": "-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA", "expires_in": 7200 }获得 sdk_ticket 之后,就可以生成扫码登录的签名了。 签名生成 签名生成规则如下: 参与签名的字段包括第三方 appid,noncestr(随机字符串), 有效的 sdk_ticket, timestamp(时间戳) 。 对所有待签名参数按照字段名(即key)的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1。 这里需要注意的是所有参数名均为小写字符。 对 string1 作 sha1 加密,字段名和字段值都采用原始值,不进行 URL 转义。即 signature=sha1(string1)。 示例: appid=wxappid sdk_ticket=-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA noncestr=noncestr timestamp=1417508194 1.对所有待签名参数按照字段名(即key)的 ASCII 码从小到大排序(字典序) appid、noncestr、sdk_ticket、timestamp 2.使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1: appid=wxappid&noncestr=noncestr&sdk_ticket=-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA×tamp=1417508194 3.对 string1 进行 sha1 签名,得到 signature: 429eaaa13fd71efbc3fd344d0a9a9126835e7303 |
CopyRight 2018-2019 实验室设备网 版权所有 |